<?php
class Database {
    public $db;
    
    public function __construct() {
        try {
            //Do not use 'localhost' use 127.0.0.1 (the ip) instead! this is MUCH faster
            $this->db = new PDO('mysql:host=127.0.0.1;dbname=funda_site_2;charset=utf8', "root", "");
            
            //Security
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            //Debugging
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            
        } catch(PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
    }

    public function searchWoning($limit, $page, $soort_bouw, $straatnaam, $huisnummer, $toevoeging,
            $postcode, $plaatsnaam, $opp_min, $opp_max, $kamers_min,
            $kamers_max, $vraagprijs_min, $vraagprijs_max, $soort_object, $count) {   
        $address = "";
        if(!empty($straatnaam)) {
            $address = $straatnaam." ".$huisnummer." ".$toevoeging;
        }
        $address = trim($address);
        $sql = "SELECT ";
        if($count == true) {
            $page = -1;
            $sql .= "COUNT(*) ";
        }
        else {
            $sql .= "wo.woid AS woid, wo.address AS address, wo.pc AS pc, wo.city AS city,
            vraagprijs, woonoppervlakte, aantalkamers, 
            soortvraagprijs.name AS prijssoort, mkantoor.name AS kantoor, wo.soortobject AS object ";
        }
        $sql .= "FROM wo, soortbouw, soortvraagprijs, mkantoor
            WHERE mkantoor.mkid = wo.mkid 
            AND soortvraagprijs.id = wo.vraagprijssoort
            AND wo.soortbouw = soortbouw.id ";
        if($postcode != "") $sql .= " AND wo.pc = :postcode";
        if($address != "") $sql .= " AND wo.address = :address";
        if($soort_bouw != "") $sql .= " AND soortbouw.id = :soort_bouw";
        if($plaatsnaam != "") $sql .= " AND wo.city = :plaatsnaam ";
        if($opp_min != "") $sql .= " AND wo.WoonOppervlakte BETWEEN :opp_min AND :opp_max";
        if($kamers_min != "") $sql .= " AND wo.AantalKamers BETWEEN :kamers_min AND :kamers_max";
        if($vraagprijs_min != "") $sql .= " AND wo.Vraagprijs BETWEEN :vraagprijs_min AND :vraagprijs_max";
        if($soort_object != "") $sql .= " AND wo.soortobject = :soortobject";
        if($page != -1) $sql .= " LIMIT :row,:limit";
        $statement = $this->db->prepare($sql); 
        
        if($address != "")$statement->bindParam(':address', $address, PDO::PARAM_STR);
        if($postcode != "") $statement->bindParam(':postcode', $postcode, PDO::PARAM_STR);
        if($plaatsnaam != "") $statement->bindParam(':plaatsnaam', $plaatsnaam, PDO::PARAM_STR);
        if($soort_bouw != "") $statement->bindParam(':soort_bouw', $soort_bouw, PDO::PARAM_INT);
        if($opp_min != "") {
            $statement->bindParam(':opp_min', $opp_min, PDO::PARAM_INT);
            $statement->bindParam(':opp_max', $opp_max, PDO::PARAM_INT);
        }
        if($kamers_min != "") {
            $statement->bindParam(':kamers_min', $kamers_min, PDO::PARAM_INT);
            $statement->bindParam(':kamers_max', $kamers_max, PDO::PARAM_INT);
        }
        if($vraagprijs_min != "") {
            $statement->bindParam(':vraagprijs_min', $vraagprijs_min, PDO::PARAM_INT);
            $statement->bindParam(':vraagprijs_max', $vraagprijs_max, PDO::PARAM_INT);
        }
        if($soort_object != "") $statement->bindParam(':soortobject', $soort_object, PDO::PARAM_INT);

        if($page != -1) {
            $statement->bindParam(':limit', $limit, PDO::PARAM_INT);
            $row = $page * $limit;
            $statement->bindParam(':row', $row, PDO::PARAM_INT);
        }   
        $statement->execute();
        if($count == true) {
            return $statement->fetchColumn();
        }
        else {
            return $statement->fetchAll();
        }
    }
    
    public function countWoningen() {
        $statement = $this->db->prepare("SELECT COUNT(*) FROM wo");
        $statement->execute();
        return $statement->fetchAll();
    }
    
    public function selectSoortBouw() {
        $statement = $this->db->prepare("SELECT id, name FROM soortbouw");
        $statement->execute();
        return $statement->fetchAll();   
    }
    
    public function selectSoortObject() {
        $statement = $this->db->prepare("SELECT id, name FROM soortobject");
        $statement->execute();
        return $statement->fetchAll();
    }
    
    public function selectMakelaars($woid) {
        $statement = $this->db->prepare("
            SELECT mkantoormdw.mkmdwid AS id, mkantoormdw.name AS name
            FROM mkantoormdw, mkantoor, wo
            WHERE wo.mkid = mkantoor.mkid
            AND mkantoormdw.mkid = mkantoor.mkid
            AND wo.woid = :woid
            ");
        $statement->bindParam(':woid', $woid, PDO::PARAM_STR);
        $statement->execute();
        return $statement->fetchAll();
    }
    
    public function checkTijd($tijd, $woning_id, $mkmdwid) {
        $statement = $this->db->prepare("
            SELECT tijd
            FROM afspraken
            WHERE afspraken.woid = :woid
            AND mkmdwid = :mkmdwid
            AND tijd = :tijd");
        $statement->bindParam(':woid', $woning_id, PDO::PARAM_STR);
        $statement->bindParam(':mkmdwid', $mkmdwid, PDO::PARAM_INT);
        $statement->bindParam(':tijd', $tijd, PDO::PARAM_STR);
        $statement->execute();
        if($statement->rowCount() == 0) return true;
        return false;
    }
    
    public function insertAfspraak($woid, $mkmdwid, $tijd) {
        $statement = $this->db->prepare("
            INSERT INTO afspraken 
            (woid, mkmdwid, tijd) 
            VALUES (:woid, :mkmdwid, :tijd);");
        $statement->bindParam(':woid', $woid, PDO::PARAM_STR);
        $statement->bindParam(':mkmdwid', $mkmdwid, PDO::PARAM_INT);
        $statement->bindParam(':tijd', $tijd, PDO::PARAM_STR);
        $statement->execute();

    }
    
    public function getAllGegevens($woid) {
        $statement = $this->db->prepare("SELECT address, vraagprijs, pc, city, omschrijving
                                         FROM wo WHERE woid=:woid");
        $statement->bindParam(':woid', $woid, PDO::PARAM_STR);
        $statement->execute();
        return $statement->fetch();
    }
    
    public function selectLiggingen($woid) {
        $statement = $this->db->prepare("SELECT ligging.name AS liggingname
                                         FROM wo_ligging, ligging
                                         WHERE wo_ligging.ligging_id = ligging.id
                                         AND wo_ligging.woid=:woid                                                                     
                                         ");
        $statement->bindParam(':woid', $woid, PDO::PARAM_STR);
        $statement->execute();
        return $statement->fetchAll();
    }
   
    public function getAllAttribute($woid) {
        $statement = $this->db->prepare("SELECT wo.woid AS woid, wo.address AS address,
                                         wo.pc AS postcode, wo.city AS plaats,
                                         wo.vraagprijs AS vraagprijs,
                                         soortvraagprijs.name AS soortvraagprijs, mkantoor.name AS makelaar_name, 
                                         soortobject.name AS soortobject, soortwoning.name AS soortwoning, typewoning.name AS typewoning,
                                         soortbouw.name AS soortbouw, status.name AS status,
                                         wo.bouwjaar AS bouwjaar, wo.tuinaanwezig AS tuin, 
                                         wo.tuinoppervlakte AS tuinoppervlakte, wo.woonoppervlakte AS woonoppervlakte,
                                         wo.inhoud AS inhoud, wo.aantalkamers AS aantalkamers,
                                         wo.aantalbadkamers AS aantalbadkamers, wo.aantalwoonlagen AS aantalwoonlagen,
                                         perceeloppervlakte, plaatsingdatum
                                         FROM wo
                                         LEFT JOIN mkantoor ON wo.mkid = mkantoor.mkid
                                         LEFT JOIN soortvraagprijs ON wo.vraagprijssoort = soortvraagprijs.id
                                         LEFT JOIN soortobject ON wo.soortobject = soortobject.id
                                         LEFT JOIN soortwoning ON wo.soortwoning = soortwoning.id
                                         LEFT JOIN typewoning ON wo.typewoning = typewoning.id
                                         LEFT JOIN soortbouw ON wo.soortbouw = soortbouw.id
                                         LEFT JOIN status ON wo.status=status.id
                                         WHERE woid=:woid                                                                     
                                         ");
        $statement->bindParam(':woid', $woid, PDO::PARAM_STR);
        $statement->execute();
        return $statement->fetch();
    }
}
?>